package com.woniuxy.goods.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.woniuxy.goods.client.AdminFeignClient;
import com.woniuxy.goods.dto.AttrConfigDto;
import com.woniuxy.goods.dto.AttrGroupDto;
import com.woniuxy.goods.dto.AttrInfoDto;
import com.woniuxy.goods.dto.GroupTypeDto;
import com.woniuxy.goods.entity.AttributeConfig;
import com.woniuxy.goods.entity.AttributeGroup;
import com.woniuxy.goods.mapper.AttributeConfigMapper;
import com.woniuxy.goods.param.AddAttrConfigParam;
import com.woniuxy.goods.param.UpdateAttrConfigParam;
import com.woniuxy.goods.service.AttributeConfigService;
import com.woniuxy.goods.service.AttributeGroupService;
import com.woniuxy.goods.service.AttributeInfoService;
import com.woniuxy.goods.service.GroupTypeService;
import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.DeleteMapping;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 *  服务实现类
 * </p>
 * 属性组、属性绑定服务层实现类
 * @author ...
 * @since 2024年05月25日
 */
@Service
public class AttributeConfigServiceImpl extends ServiceImpl<AttributeConfigMapper, AttributeConfig> implements AttributeConfigService {
    /**
     * 属性组服务层接口
     */
    @Resource
    private AttributeGroupService attrGroupService;
    /**
     * 属性服务层接口
     */
    @Resource
    private AttributeInfoService attrInfoService;
    /**
     * 属性组类别绑定服务层接口
     */
    @Resource
    private GroupTypeService groupTypeService;

    /**
     * 新增属性组、属性绑定
     * @param param 新增属性组属性配置对象
     * @return 属性组属性配置dto对象集合
     * @throws Exception
     */
    @Override
    @GlobalTransactional(rollbackFor = Throwable.class)
    public List<AttrConfigDto> addAttrConfig(AddAttrConfigParam param) throws Exception {
        AttrGroupDto groupDto = attrGroupService.findAttrGroupById(param.getGroupId());
        if (groupDto==null) throw new Exception("属性组不存在");
        List<AttrInfoDto> infoDtos = attrInfoService.findAttrInfosByIds(param.getAttributeId());
        if (infoDtos==null||infoDtos.size()!=param.getAttributeId().size()) throw new Exception("属性不存在");
        QueryWrapper<AttributeConfig> wrapper = new QueryWrapper<>();
        wrapper.eq("group_id",param.getGroupId());
        wrapper.in("attribute_id",param.getAttributeId());
        AttributeConfig selectOne = this.getOne(wrapper);
        if (ObjectUtil.isNotEmpty(selectOne)) throw new Exception("该属性组已存在已存在"+selectOne.getAttributeId()+"属性");
        List<AttrConfigDto> dtos = new ArrayList<>();
        for (AttrInfoDto infoDto : infoDtos) {
            AttributeConfig config = new AttributeConfig();
            config.setAttributeId(infoDto.getAttributeId());
            config.setGroupId(param.getGroupId());
            save(config);
            AttrConfigDto dto = new AttrConfigDto();
            dto.setId(config.getId());
            dto.setGroupDto(groupDto);
            dto.setInfoDto(infoDto);
            dtos.add(dto);
        }
        return dtos;
    }

    /**
     * 删除属性组、属性绑定
     * @param id 属性组属性绑定信息id
     * @return
     * @throws Exception
     */
    @Override
    public void delAttrConfig(Integer id) {
        removeById(id);
    }

    /**
     * 通过属性组id删除属性组、属性绑定
     * @param groupId 属性组id
     * @return
     * @throws Exception
     */
    @Override
    public void delConfigByGroupId(Integer groupId) {
        QueryWrapper<AttributeConfig> wrapper = new QueryWrapper<>();
        wrapper.eq("group_id",groupId);
        remove(wrapper);
    }

    /**
     * 通过属性id删除属性组、属性绑定
     * @param attributeId 属性id
     * @return
     * @throws Exception
     */
    @Override
    public void delConfigByAttrId(Integer attributeId) {
        QueryWrapper<AttributeConfig> wrapper = new QueryWrapper<>();
        wrapper.eq("attribute_id",attributeId);
        remove(wrapper);
    }

    /**
     * 通过id修改属性组、属性绑定
     * @param param 修改属性组属性配置对象
     * @return 属性组属性配置dto对象
     * @throws Exception
     */
    @Override
    @GlobalTransactional(rollbackFor = Throwable.class)
    public AttrConfigDto updateAttrConfigById(UpdateAttrConfigParam param) throws Exception {
        AttributeConfig config = getById(param.getId());
        if (config==null) throw new Exception("该绑定信息不存在");
        AttrGroupDto groupDto = attrGroupService.findAttrGroupById(param.getGroupId());
        if (groupDto==null) throw new Exception("属性组不存在");
        AttrInfoDto infoDto = attrInfoService.findAttrInfoById(param.getAttributeId());
        if (infoDto==null) throw new Exception("属性不存在");
        AttributeConfig bean = BeanUtil.toBean(param, AttributeConfig.class);
        updateById(bean);
        AttrConfigDto dto = new AttrConfigDto();
        dto.setId(config.getId());
        dto.setGroupDto(groupDto);
        dto.setInfoDto(infoDto);
        return dto;
    }

    /**
     * 通过属性组id修改绑定属性
     * @param param 新增属性组属性配置对象
     * @return 属性组属性配置dto对象集合
     * @throws Exception
     */
    @Override
    @GlobalTransactional(rollbackFor = Throwable.class)
    public List<AttrConfigDto> updateConfigByGroupId(AddAttrConfigParam param) throws Exception {
        QueryWrapper<AttributeConfig> wrapper = new QueryWrapper<>();
        wrapper.eq("group_id",param.getGroupId());
        remove(wrapper);
        List<AttrConfigDto> dtos = addAttrConfig(param);
        return dtos;
    }

    /**
     * 通过id查找属性组、属性绑定
     * @param id 属性组属性绑定信息id
     * @return 属性组属性配置dto对象
     * @throws Exception
     */
    @Override
    public AttrConfigDto findAttrConfigById(Integer id) throws Exception {
        AttributeConfig config = getById(id);
        if (config==null) throw new Exception("该绑定信息不存在");
        AttrGroupDto groupDto = attrGroupService.findAttrGroupById(config.getGroupId());
        AttrInfoDto infoDto = attrInfoService.findAttrInfoById(config.getAttributeId());
        AttrConfigDto dto = new AttrConfigDto();
        dto.setId(config.getId());
        dto.setGroupDto(groupDto);
        dto.setInfoDto(infoDto);
        return dto;
    }

    /**
     * 通过属性组id查找属性组、属性绑定
     * @param groupId 属性组id
     * @return 属性组属性绑定信息集合
     * @throws Exception
     */
    @Override
    public List<AttrConfigDto> findConfigByGroupId(Integer groupId) throws Exception {
        QueryWrapper<AttributeConfig> wrapper = new QueryWrapper<>();
        wrapper.eq("group_id",groupId);
        List<AttributeConfig> configs = list(wrapper);
        List<AttrConfigDto> dtos = new ArrayList<>();
        for (AttributeConfig config : configs) {
            AttrGroupDto groupDto = attrGroupService.findAttrGroupById(config.getGroupId());
            AttrInfoDto infoDto = attrInfoService.findAttrInfoById(config.getAttributeId());
            AttrConfigDto dto = new AttrConfigDto();
            dto.setId(config.getId());
            dto.setGroupDto(groupDto);
            dto.setInfoDto(infoDto);
            dtos.add(dto);
        }
        return dtos;
    }

    /**
     * 通过属性id查找属性组、属性绑定
     * @param attributeId 属性id
     * @return 属性组属性绑定信息集合
     * @throws Exception
     */
    @Override
    public List<AttrConfigDto> findConfigByAttrId(Integer attributeId) throws Exception {
        QueryWrapper<AttributeConfig> wrapper = new QueryWrapper<>();
        wrapper.eq("attribute_id",attributeId);
        List<AttributeConfig> configs = list(wrapper);
        List<AttrConfigDto> dtos = new ArrayList<>();
        for (AttributeConfig config : configs) {
            AttrGroupDto groupDto = attrGroupService.findAttrGroupById(config.getGroupId());
            AttrInfoDto infoDto = attrInfoService.findAttrInfoById(config.getAttributeId());
            AttrConfigDto dto = new AttrConfigDto();
            dto.setId(config.getId());
            dto.setGroupDto(groupDto);
            dto.setInfoDto(infoDto);
            dtos.add(dto);
        }
        return dtos;
    }

    /**
     * 通过属性组类别id查找属性
     * @param id 属性组类别id
     * @return 属性信息集合
     * @throws Exception
     */
    @Override
    public List<AttrInfoDto> findConfigById(Integer id) throws Exception {
        GroupTypeDto groupType = groupTypeService.findGroupTypeById(id);
        if (groupType==null) throw new Exception("属性组类别绑定信息不存在");
        Integer groupId = groupType.getGroupDto().getGroupId();
        List<AttrConfigDto> dtoList = this.findConfigByGroupId(groupId);
        List<AttrInfoDto> infoDtos = dtoList.stream().map(o -> o.getInfoDto()).collect(Collectors.toList());
        return infoDtos;
    }
}
